package yangsw87.basic;

public class J12_SungJuk_v4b {

	public static void main(String[] args) {
		// 접근 지정자를 이용해서 SungJuk 클래스 정의
		J12SungJuk sj = new J12SungJuk();
		// sj.name = "지현"; // 사용할 수 없다. private로 되어있기 때문.
		// name 멤버변수는 접근지정자가 private이므로
		// 위 코드처럼 작성하면 오류 발생!

		sj = new J12SungJuk("지현", 98, 45, 23);
		sj.getTot();
		sj.getAvg();
		sj.getGrd();
		// 어쩔 수 없이 생성자를 이용해서
		// name, kor, eng, mat 멤버변수를 초기화 함

		// System.out.println(sj.name);
		// 하지만, 기존 방식으로 name 변수를 출력하려해도
		// private 접근 지정자 때문에 오류 발생!

		// 따라서, private으로 선언된 멤버변수를
		// 조작하거나 값을 읽어올려면
		// 그것을 위한 특별한 메서드를 작성하는 것이 좋음
		// 실무에서는 setter/getter 메서드를 작성함
		// sj.setName("수지");
		// sj.setKor(90);
		// sj.setEng(80);
		// sj.setMat(90);

		// System.out.println(sj.getName());
		// System.out.println(sj.getKor());
		// System.out.println(sj.getEng());
		// System.out.println(sj.getMat());
		//
		// System.out.println(sj.getTot());
		// System.out.println(sj.getAvg());
		// System.out.println(sj.getGrd());

		// toString() 메서드를 이용해서
		// 객체의 모든 멤버변수 출력하기

		System.out.println(sj.toString());

	} // main

} // class

class J12SungJuk {
	private String name;
	private int kor;
	private int eng;
	private int mat;

	private int tot;
	private double avg;
	private char grd;

	public J12SungJuk() {
	}

	public J12SungJuk(String name, int kor, int eng, int mat) {
		this.name = name;
		this.kor = kor;
		this.eng = eng;
		this.mat = mat;

	}

	// setter 메서드 : 멤버변수에 값을 set하기 위한 메서드 // setter은 사용안하고 생성자로
	// public void set멤버변수명( 자료형 멤버변수명 ) { // 사용할 수 있는 것은 사용하는 것이 낫다.
	// this.멤버변수명 = 멤버변수명;
	// }
	// public void setName(String name) { // 이름
	// this.name = name;
	// }
	//
	// public void setKor(int kor) { // 국어
	// this.kor = kor;
	// }
	//
	// public void setEng(int eng) { // 영어
	// this.eng = eng;
	// }
	//
	// public void setMat(int mat) { // 수학
	// this.mat = mat;
	// }
	//
	// public void setTot(int tot) { // 총점
	// this.tot = tot;
	// }
	//
	// public void setAvg(double avg) { // 평균
	// this.avg = avg;
	// }
	//
	// public void setGrd(char grd) { // 성적
	// this.grd = grd;
	// }

	// getter 메서드 : 멤버변수에 값을 get하기 위한 메서드
	// public 멤버변수자료형 get멤버변수명() {
	// return 멤버변수명;
	// }
	public String getName() { // 이름
		return name;
	}

	public int getKor() { // 국어
		return kor;
	}

	public int getEng() { // 영어
		return eng;
	}

	public int getMat() { // 수학
		return mat;
	}

	// 객체지향 프로그래밍에서는
	// 메서드에 너무 많은 책임을 부여하는 것을 금지하고 있음
	// 예를들어, getTot 메서드를 살펴보면
	// 단순히 tot 변수의 값을 읽어오는 기능외에
	// 입력한 성적데이터에 대한 총점을 구하는 기능도 포함

	public int getTot() { // 총점
		tot = kor + eng + mat;
		// setTot(kor+eng+mat);
		return tot;
	}

	public double getAvg() { // 평균
		avg = getTot() / 3;
		return avg;
	}

	public char getGrd() { // 성적
		switch ((int) getAvg() / 10) {
		case 10:
		case 9:
			grd = '수';
			break;
		case 8:
			grd = '우';
			break;
		case 7:
			grd = '미';
			break;
		case 6:
			grd = '양';
			break;
		default:
			grd = '가';
		}
		
		return grd;
	}

	// 멤버변수의 모든 값을 출력하기 위해
	// Object 클래스가 기본적으로 제공하는
	// 메서드인 toString()을 재정의override
	@Override
	// 어노테이션 : 컴파일러를 위한 주석
	public String toString() {
	
		
		String result = "";
		result = result + " 이름 : " + name + "\n";
		result += " 국어 : " + kor + "\n";
		result += " 영어 : " + eng + "\n";
		result += " 수학 : " + mat + "\n";

		result += " 총점 : " + tot + "\n";
		result += " 평균 : " + avg + "\n";
		result += " 학점 : " + grd;

		return result;
	}
}
